stop/start RDS instance และ Aurora cluster แบบอัตโนมัติได้ง่าย ๆ ด้วย Amazon EventBridge Scheduler

stop/start RDS instance และ Aurora cluster แบบอัตโนมัติได้ง่าย ๆ ด้วย Amazon EventBridge Scheduler

ผมได้ลอง stop/start RDS instance และ Aurora cluster แบบอัตโนมัติด้วย Amazon EventBridge Scheduler ดูครับ ทุกคนก็สามารถทำตามได้แบบง่าย ๆ ภายใน 5 นาทีเท่านั้นครับ

ลืม stop RDS database...

ทุกท่านเคยลืม stop RDS database กันบ้างไหมครับ ส่วนตัวผมเคยอยู่นับครั้งไม่ถ้วนเลยครับ
และเนื่องจากค่าบริการของ RDS ค่อนข้างแพง พอลืม stop database แต่ละครั้งก็จะเจ็บหนักเอาเรื่องเลยครับ

อีกทั้งใน User Guide ก็มีเขียนไว้ครับว่าต่อให้เรา stop RDS instance ไปแล้ว แต่หลังจากผ่านไป 7 วันมันก็จะกลับมา start ใหม่เองอยู่ดี

If you don't manually start your DB instance after it is stopped for seven consecutive days, RDS automatically starts your DB instance for you.

เพราะฉะนั้นในบทความนี้ ผมจะมาสาธิตการใช้ Amazon EventBridge Scheduler สำหรับ stop database นานกว่า 7 วัน และถือโอกาสลอง start database ด้วยเลยครับ

สำหรับรายละเอียดของ Amazon EventBridge Scheduler สามารถดูได้จากบทความนี้ครับ
[ฟีเจอร์ใหม่]เปิดตัว Amazon EventBridge Scheduler ที่สามารถ schedule โดยระบุ Timezone ได้

ภาพโครงสร้างโดยรวม

นี่คือภาพโครงสร้างของสิ่งที่เราจะทำกันในครั้งนี้ เรียบง่ายแต่ได้ผลครับ

01

อธิบายคร่าว ๆ ก็คือ เราจะตั้งค่าให้ EventBridge Scheduler ทำการ stop database ซ้ำทุก ๆ 7 วัน นั่นหมายความว่าเมื่อ database ของเราเกิด start ขึ้นมาเองหลังจากผ่านมา 7 วัน EventBridge Scheduler ก็จะทำการ stop ซ้ำให้เราครับ

เตรียมตัวก่อนเริ่ม

1. สร้าง IAM policy ที่จำเป็น

ในบทความนี้ผมจะใช้ EventBridge Scheduler ทำการ stop/start ทั้ง RDS/Aurora Instance, และ Aurora Serverless V2 Cluster ครับ ซึ่ง policy ที่จำเป็นจะแตกต่างกันขึ้นอยู่กับประเภทของ database ว่าเป็น instance หรือ cluster
สำหรับท่านที่จะทำตามบทความนี้ อย่าลืมสร้าง policy ที่ตรงกับประเภทของ database ด้วยนะครับ

ก่อนอื่นไปที่หน้า console ของ IAM เลือกเมนู Policies ที่แถบด้านซ้ายแล้วคลิก Create Policy

03

ที่หน้า Specify permissions ให้สลับโหมดของ policy editor เป็น JSON จากนั้นลบทุกอย่างใน policy editor ออกให้หมดแล้วใส่ policy ด้านล่างนี้ลงไปแทน (เลือก policy ให้ตรงกับประเภทของ database) จากนั้นคลิก Next

กรณีที่ประเภทของ database เป็น RDS และ Aurora ให้ใช้ policy นี้

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "StopAndStartRDSInstance",
			"Effect": "Allow",
			"Action": [
				"rds:StopDBInstance",
				"rds:StartDBInstance"
			],
			"Resource": "*"
		}
	]
}

กรณีที่ประเภทของ database เป็น Aurora Serverless V2 ให้ใช้ policy นี้

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "StopAndStartAuroraCluster",
			"Effect": "Allow",
			"Action": [
				"rds:StopDBCluster",
				"rds:StartDBCluster"
			],
			"Resource": "*"
		}
	]
}

04

ที่หน้า Review and create ให้ตั้งชื่อ policy ตามใจชอบ จากนั้นเลื่อนลงมาด้านล่างสุดแล้วคลิก Create policy

05

เนื่องจากในครั้งนี้ผมจะลองทำทั้ง RDS และ Aurora serverless ผมเลยสร้าง policy ไว้ 2 อันเลยครับ

06

2. สร้าง IAM role ที่จำเป็น

กลับมาที่หน้า console ของ IAM เลือกเมนู Roles ที่แถบด้านซ้ายแล้วคลิก Create Role

07

ที่หน้า Select trusted entity ในส่วน Trusted entity type ให้เลือก Custom trust policy
และในส่วน Custom trust policy ให้ลบ policy ออกให้หมดแล้ว policy ด้านล่างนี้ลงไปแทน (policy นี้เหมือนกันหมดไม่ว่าจะใช้ database ประเภทอะไรก็ตาม เพราะฉะนั้นใส่ได้เลยไม่ต้องกังวลครับ)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

08

ที่หน้า Add permissions ในส่วนของ Permissions policies ให้เลือก policy ที่เราสร้างไว้ในขั้นตอนก่อนหน้า จากนั้นคลิก Next

09

ที่หน้า Name, review, and create ให้ตั้งชื่อ role ตามใจชอบ จากนั้นเลื่อนลงมาด้านล่างแล้วคลิก Create role

10

11

และเหมือนเดิมครับ เนื่องจากในครั้งนี้ผมจะลองทำทั้ง RDS และ Aurora serverless ผมเลยสร้าง role ไว้ 2 อันเช่นกัน

12

RDS & Aurora

เนื่องจากทั้ง RDS และ Aurora (ที่ไม่ใช่ serverless) นั้น มีขั้นตอนการทำเหมือนกันเป๊ะ ๆ ครั้งนี้ผมเลยจะสาธิตแค่ครั้งเดียวโดยใช้ RDS ครับ

ก่อนอื่นเราก็ต้องมี database ที่อยากจะ stop/start ก่อน ซึ่งในครั้งนี้ผมได้เปิดใช้งาน database ชื่อ [my-rds-database] เตรียมเอาไว้ครับ

13

สำหรับวิธีการสร้าง RDS/Aurora instance สามารถดูได้ที่บทความนี้ครับ

Stop Instance

ไปที่หน้า console ของ EventBridge เลือกเมนู Schedules ที่แถบด้านซ้ายแล้วคลิก Create schedule

14

ที่หน้า Specify schedule detail ในส่วนของ Schedule name and description ให้เราตั้งชื่อ schedule ตามใจชอบ

15

จากนั้นในส่วนของ Schedule pattern เราสามารถเลือกได้ว่าจะให้ schedule นี้ทำงานแค่ครั้งเดียว หรือทำงานแบบต่อเนื่องตามที่เรากำหนดไว้ (เช่น ทุกวัน, ทุกชั่วโมง, ฯลฯ)

ในการสาธิตครั้งนี้ผมเลือกแบบ cron-based schedule และตั้งค่าให้ schedule ทำงานทุก ๆ วันที่เวลา 12:35 น. โดยจะสังเกตได้จาก Next 10 trigger dates ที่จะบอกรายละเอียดว่า schedule นี้จะทำงานครั้งต่อ ๆ ไปที่วันไหนเวลาไหน
สำหรับรายละเอียดเกี่ยวกับ cron expression สามารถดูได้ที่ Cron expressions reference - Amazon EventBridge

16

แต่ถ้าเราต้องการให้ schedule นี้ทำงานทุก ๆ 7 วัน ผมสามารถเลือก rate-based schedule ตั้งค่าให้ schedule ทำงานทุก ๆ 7 วันได้ครับ

16-1

หลังจากตั้งค่าในส่วนนี้เรียบร้อยแล้ว ให้กด Next

ในส่วนต่อมาเราจะเลือก API ที่จะให้ schedule นี้เรียกใช้เมื่อถึงเวลาที่เราตั้งไว้
ในส่วนของ Target API ให้เลือก All APIs จากนั้นค้นหา Amazon RDS

17

ค้นหา StopDBInstance แล้วเลือก API ตัวนั้นได้เลยครับ

18

เลื่อนลงมาด้านล่าง แล้วกรอกชื่อ RDS instance ที่ต้องการ stop ลงไป ซึ่งในครั้งนี้ก็คือ my-rds-database จากนั้นคลิก Next

19

ในส่วนของ Action after schedule completion ส่วนนี้ให้เราตั้งค่าว่าหลังจากที่ schedule ทำงานเสร็จแล้ว (run schedule ครั้งสุดท้ายแล้ว) เราจะเอายังไงกับ schedule นี้ เราสามารถเลือกได้ระหว่าง NONE คือ ไม่ทำอะไร และ DELETE คือ ให้ลบ schedule นี้ทิ้ง
เนื่องจาก schedule นี้ทำงานแบบต่อเนื่อง นั่นหมายความว่าจะไม่มีการ run schedule ครั้งสุดท้ายสำหรับ schedule นี้ เพราะฉะนั้นจริง ๆ เราสามารถเลือกอะไรก็ได้ครับ แต่เราจะเลือก NONE กันไว้ก่อนครับ

20

เลื่อนลงมาด้านล่าง ในส่วน Permission ให้เลือก Use existing role แล้วเลือก role ที่สร้างไว้ก่อนหน้านี้ จากนั้นคลิก Next

21

จากนั้นเรามาจะอยู่ที่หน้า Review and create schedule ให้เราตรวจสอบข้อมูลการตั้งค่าทั้งหมด หากมั่นใจว่าถูกต้องแล้วให้คลิก Create schedule ได้เลยครับ

เมื่อสร้าง schedule แล้ว สิ่งที่เหลือก็แค่รอดูการทำงานของมันครับ ตอนนี้ RDS instance ของผมอยู่ในสถานะ Available หรือก็คือเปิดอยู่

13

หลังจากถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ stop RDS instance ตัวดังกล่าว และสถานะของ RDS instance ก็เปลี่ยนเป็น Stopping ตามที่คาดไว้

22

Start Instance

หลังจาก stop instance กันไปแล้ว คราวนี้เราจะมาลอง start instance กันบ้างครับ เนื่องจากขั้นตอนในส่วนนี้แทบจะเหมือนกับตอน stop instance เพราะฉะนั้นขอให้ดูในส่วนของ Stop Instance อ้างอิงด้วยนะครับ

การ start instance ให้เราทำเหมือนกับตอน stop instance ทุกอย่างจนกระทั่งถึงขั้นตอนการเลือก API ในครั้งนี้ให้เราเลือก StartDBInstance แทน

23

จากนั้นเลื่อนลงมาด้านล่าง ก็ให้กรอกชื่อ RDS instance ที่ต้องการ stop ลงไปเหมือนเดิม ส่วนขั้นตอนที่เหลือจะเหมือนกับการ stop instance ทุกประการ ก็สามารถดูในส่วนของ Stop Instance แล้วทำตามได้เลยครับ

24

จากนั้นเราก็รอดูผลลัพธ์การทำงานของ schedule ของเรา จะเห็นได้ว่าตอนนี้ RDS instance ของผมอยู่ในสถานะ Stopped temporarily หรือก็คือถูกปิดอยู่

25

เมื่อถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ start RDS instance ตัวดังกล่าว และสถานะของ RDS instance ก็เปลี่ยนเป็น Starting ตามที่คาดไว้

26

Aurora Serverless V2

ที่จริงแล้วขั้นตอนการ stop/start DB cluster ด้วย scheduler แทบจะเหมือนกับการ stop/start DB instance ที่สาธิตไปด้านบนเลยครับ แตกต่างกันแค่ IAM role, IAM policy และ API ที่ใช้ แต่เพื่อไม่ให้สับสน ผมจะเริ่มใหม่ตั้งแต่ต้นเลยครับ

สำหรับท่านที่อ่านเนื้อหาในส่วน RDS & Aurora มาก่อน อาจจะรู้สึกว่าทั้งเนื้อหา ลำดับ การใช้คำพูดมันเหมือนกันทุกอย่าง ซึ่งใช่ครับ ผมแทบจะ copy-paste เนื้อหาจากในส่วนก่อนหน้ามาเลย เผื่อมีผู้อ่านบางท่านที่ข้ามเนื้อหาในส่วนก่อนหน้าทั้งหมดมาอ่านในส่วนนี้เลย ก็จะได้ไม่งง และไม่ต้องกลับไปอ่านเนื้อหาด้านบนทั้งหมดมาก่อนครับ

สำหรับ database ที่ผมจะใช้ในครั้งนี้ คือ Aurora serverless v2 cluster ที่ชื่อ my-aurora-serverless-v2-database ซึ่งใน cluster มี DB instance อยู่ 1 ตัวครับ ชื่อ my-aurora-serverless-v2-database-instance-1

27

สำหรับวิธีการสร้าง Aurora Serverless cluster สามารถดูได้ที่บทความนี้ครับ

Stop Cluster

ไปที่หน้า console ของ EventBridge เลือกเมนู Schedules ที่แถบด้านซ้ายแล้วคลิก Create schedule

28

ที่หน้า Specify schedule detail ในส่วนของ Schedule name and description ให้เราตั้งชื่อ schedule ตามใจชอบ

29

จากนั้นในส่วนของ Schedule pattern เราสามารถเลือกได้ว่าจะให้ schedule นี้ทำงานแค่ครั้งเดียว หรือทำงานแบบต่อเนื่องตามที่เรากำหนดไว้ (เช่น ทุกวัน, ทุกชั่วโมง, ฯลฯ)

ในการสาธิตครั้งนี้ผมเลือกแบบ cron-based schedule และตั้งค่าให้ schedule ทำงานทุก ๆ วันที่เวลา 12:00 น. โดยจะสังเกตได้จาก Next 10 trigger dates ที่จะบอกรายละเอียดว่า schedule นี้จะทำงานครั้งต่อ ๆ ไปที่วันไหนเวลาไหน
สำหรับรายละเอียดเกี่ยวกับ cron expression สามารถดูได้ที่ Cron expressions reference - Amazon EventBridge

30

แต่ถ้าเราต้องการให้ schedule นี้ทำงานทุก ๆ 7 วัน ผมสามารถเลือก rate-based schedule ตั้งค่าให้ schedule ทำงานทุก ๆ 7 วันได้ครับ

16-1

หลังจากตั้งค่าในส่วนนี้เรียบร้อยแล้ว ให้กด Next

ในส่วนต่อมาเราจะเลือก API ที่จะให้ schedule นี้เรียกใช้เมื่อถึงเวลาที่เราตั้งไว้
ในส่วนของ Target API ให้เลือก All APIs จากนั้นค้นหา Amazon RDS

31

ค้นหา StopDBCluster แล้วเลือก API ตัวนั้นได้เลยครับ

32

เลื่อนลงมาด้านล่าง แล้วกรอกชื่อ Aurora cluster ที่ต้องการ stop ลงไป ซึ่งในครั้งนี้ก็คือ my-aurora-serverless-v2-database จากนั้นคลิก Next

33

ในส่วนของ Action after schedule completion ส่วนนี้ให้เราตั้งค่าว่าหลังจากที่ schedule ทำงานเสร็จแล้ว (run schedule ครั้งสุดท้ายแล้ว) เราจะเอายังไงกับ schedule นี้ เราสามารถเลือกได้ระหว่าง NONE คือ ไม่ทำอะไร และ DELETE คือ ให้ลบ schedule นี้ทิ้ง
เนื่องจาก schedule นี้ทำงานแบบต่อเนื่อง นั่นหมายความว่าจะไม่มีการ run schedule ครั้งสุดท้ายสำหรับ schedule นี้ เพราะฉะนั้นจริง ๆ เราสามารถเลือกอะไรก็ได้ครับ แต่เราจะเลือก NONE กันไว้ก่อนครับ

34

เลื่อนลงมาด้านล่าง ในส่วน Permission ให้เลือก Use existing role แล้วเลือก role ที่สร้างไว้ก่อนหน้านี้ จากนั้นคลิก Next

35

จากนั้นเรามาจะอยู่ที่หน้า Review and create schedule ให้เราตรวจสอบข้อมูลการตั้งค่าทั้งหมด หากมั่นใจว่าถูกต้องแล้วให้คลิก Create schedule ได้เลยครับ

เมื่อสร้าง schedule แล้ว สิ่งที่เหลือก็แค่รอดูการทำงานของมันครับ ตอนนี้ Aurora cluster ของผมอยู่ในสถานะ Available หรือก็คือเปิดอยู่

27

หลังจากถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ stop Aurora cluster ดังกล่าว และสถานะของ Aurora cluster รวมถึง instance ใน cluster ก็เปลี่ยนเป็น Stopping ตามที่คาดไว้

36

Start Cluster

เช่นเดียวกับตอน stop/start DB instance ครับ การ stop DB cluster และ start DB cluster แทบจะเหมือนกัน เพราะฉะนั้นรบกวนดูส่วนของการ Stop Cluster อ้างอิงด้วยนะครับ

การ start cluster ให้เราทำเหมือนกับตอน stop cluster ทุกอย่างจนกระทั่งถึงขั้นตอนการเลือก API ในครั้งนี้ให้เราเลือก StartDBCluster แทน

37

จากนั้นเลื่อนลงมาด้านล่าง ก็ให้กรอกชื่อ Aurora cluster ที่ต้องการ stop ลงไปเหมือนเดิม ส่วนขั้นตอนที่เหลือจะเหมือนกับการ stop cluster ทุกประการ ก็สามารถดูในส่วนของ Stop Cluster แล้วทำตามได้เลยครับ

38

จากนั้นเราก็รอดูผลลัพธ์การทำงานของ schedule ของเรา จะเห็นได้ว่าตอนนี้ Aurora cluster ของผมอยู่ในสถานะ Stopped temporarily หรือก็คือถูกปิดอยู่

39

เมื่อถึงเวลาที่ตั้งเอาไว้ schedule ก็ทำการ start Aurora instance ตัวดังกล่าว และสถานะของ Aurora instance รวมถึง instance ใน cluster ก็เปลี่ยนเป็น Starting ตามที่คาดไว้

40

สุดท้ายนี้

ในบทความนี้ผมก็ได้มาสาธิตการใช้ EventBridge Scheduler ในการ stop/start RDS database ครับ ซึ่งจริง ๆ แล้ว EventBridge Scheduler ยังมีความสามารถอื่น ๆ อีกมากมาย ซึ่งถ้ามีโอกาสผมจะมาเขียนบทความเพิ่มเติมเกี่ยวกับความสามารถอื่น ๆ ของ EventBridge Scheduler ต่อไปครับ

อ้างอิง

  1. 【5分で簡単!】Amazon EventBridge SchedulerでRDSの自動定期停止を実装してみた | DevelopersIO
  2. 【SSM・Lambda不要】Amazon EventBridge SchedulerでAuroraの自動停止を実装してみた | DevelopersIO
  3. วิธีการใช้ EventBridge Scheduler ในการตั้งเวลา start/stop EC2 | DevelopersIO

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.